﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace mrp16062010
{
    class Zamanlayici
    {
        private Tarih calismaTarihleri;

        public Tarih CalismaTarihleri
        {
            get { return calismaTarihleri; }
            set
            {
                calismaTarihleri = value;
                SonTarih = value.BaslangicTarihi;
            }
        }

        public TimeSpan CalismaAraligi { get; set; }

        public TimeSpan HaberAraligi { get; set; }

        private DateTime SonTarih;
        Thread thZaman;
        bool CalisiyorMu = false;

        public Zamanlayici(TimeSpan calismaAraligi, Tarih tarihler)
        {
            CalismaTarihleri = tarihler;
            SonTarih = tarihler.BaslangicTarihi;
            CalismaAraligi = calismaAraligi;
        }

        public Zamanlayici(TimeSpan calismaAraligi)
        {
            CalismaAraligi = calismaAraligi;
        }

        public delegate void IlerlediHandler(object o, EventArgs e);

        public event IlerlediHandler Ilerledi;

        protected virtual void OnIlerledi(object o, EventArgs e)
        {
            if (Ilerledi != null)
            {
                Ilerledi(o, e);
            }
        }

        public delegate void BasladiHandler(object o, EventArgs e);

        public event BasladiHandler Basladi;

        protected virtual void OnBasladi(object o, EventArgs e)
        {
            if (Basladi != null)
            {
                Basladi(o, e);
            }
        }

        public delegate void BittiHandler(object o, EventArgs e);

        public event BittiHandler Bitti;

        protected virtual void OnBitti(object o, EventArgs e)
        {
            if (Bitti != null)
            {
                Bitti(o, e);
            }
        }

        public delegate void AralikBittiHandler(object o, EventArgs e);

        public event AralikBittiHandler AralikBitti;

        protected virtual void OnAralikBitti(object o, EventArgs e)
        {
            if (AralikBitti != null)
            {
                GC.Collect();
                AralikBitti(o, e);
            }
        }

        public delegate void GunlukAralikHandler(object o, EventArgs e);

        public event GunlukAralikHandler GunlukAralik;

        protected virtual void OnGunlukAralik(object o, EventArgs e)
        {
            if (GunlukAralik != null)
            {
                GunlukAralik(o, e);
            }
        }

        public DateTime Tarih
        {
            get { return SonTarih; }
        }

        public void Baslat()
        {
            if (CalisiyorMu)
            {

            }
            else
            {
                CalisiyorMu = true;
                /*thZaman = new Thread(new ThreadStart(ZamanArtirici));
                thZaman.Start();*/
                ZamanArtirici();
            }
        }

        private TimeSpan sonAralik = new TimeSpan();

        private TimeSpan gunlukAralik = new TimeSpan();

        private void ZamanArtirici()
        {
            if (Basladi != null)
            {
                Basladi(this, new EventArgs());
            }
            while (SonTarih <= this.CalismaTarihleri.BitisTarihi && CalisiyorMu == true)
            {
                //Belirlenen aralığa geldiyse AralikBitti ile haber ver

                //Console.Out.WriteLine("Saat:" + SonTarih.ToString());
                if (Ayarlar.Nesne.CalismaSaatleri.Max.Saat==SonTarih.Hour&& Ayarlar.Nesne.CalismaSaatleri.Max.Dakika+1==SonTarih.Minute)
                {
                    DateTime bas = new DateTime(2010,01,2,Ayarlar.Nesne.CalismaSaatleri.Min.Saat, Ayarlar.Nesne.CalismaSaatleri.Min.Dakika,0);
                    DateTime bit = new DateTime(2010,01,1,Ayarlar.Nesne.CalismaSaatleri.Max.Saat, Ayarlar.Nesne.CalismaSaatleri.Max.Dakika,0);
                    TimeSpan atlatilacak = bas - bit;
                    atlatilacak = atlatilacak.Subtract(TimeSpan.FromMinutes(1));
                    SonTarih = SonTarih.Add(atlatilacak);
                    sonAralik = sonAralik.Add(atlatilacak);
                    gunlukAralik = gunlukAralik.Add(atlatilacak);
                   // Ayarlar.Nesne.CalismaSaatleri.Min.Dakika
                }
                else
                {
                    sonAralik = sonAralik.Add(this.CalismaAraligi);
                    gunlukAralik = gunlukAralik.Add(this.CalismaAraligi);
                    SonTarih = SonTarih.Add(this.CalismaAraligi);
                }

                if (Ilerledi != null)
                {
                    this.Ilerledi(this, new EventArgs());
                }

                if (HaberAraligi <= sonAralik)
                {
                    sonAralik = new TimeSpan();
                    if (AralikBitti != null)
                    {
                        AralikBitti(this, new EventArgs());
                    }
                }

                if (gunlukAralik>TimeSpan.FromDays(1))
                {
                    gunlukAralik = new TimeSpan();
                    OnGunlukAralik(this, new EventArgs());
                }
            }
            CalisiyorMu = false;
            if (Bitti != null)
            {
                Bitti(this, new EventArgs());
            }
        }

        public void Durdur()
        {
            this.CalisiyorMu = false;
        }
    }
}
